#ifndef __LCG_UTIL_H__
#define __LCG_UTIL_H__
/* 实用工具类的实现
    1.获取系统时间
    2.判断文件是否存在
    3.获取文件的所在目录路径
    4.创建目录
*/
#include <iostream>
#include <ctime>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

namespace lcglog
{
    namespace util
    {
        class Date
        {
        public:
            // 获取当前系统时间戳，设置为静态成员函数的好处是不需要实例化出对象，即可使用
            static time_t now()
            {
                return time(nullptr);
            }
        };
        class File
        {
        public:
            // 判断文件是否存在
            static bool exits(const std::string &pathname)
            {
                //方案1：获取文件状态，若存在则可能获取成功，若不存在则一定失败
                struct stat st;
                if (stat(pathname.c_str(), &st) < 0)
                {
                    return false;
                }
                return true;
                // 方案2：access是一个系统调用接口，但代码不可移植
                //  return (access(pathname.c_str(), F_OK)==0);
            }
            // 获取文件所在路径
            static std::string path(const std::string &pathname)
            {
                //./abc/a.txt
                size_t pos = pathname.find_last_of("/\\");
                if (pos == std::string::npos)
                {
                    return ".";
                }
                return pathname.substr(0, pos + 1);
            }
            // 创建指定目录
            static void createDirectory(const std::string &pathname)
            {
                //./abc/efg/a.txt
                //./
                //./abc/
                size_t pos = 0, idx = 0;
                while (idx < pathname.size())
                {
                    pos = pathname.find_first_of("/\\", idx);
                    if (pos == std::string::npos)
                    {
                        mkdir(pathname.c_str(), 0777);
                    }

                    std::string parent_dir = pathname.substr(0, pos + 1);
                    // 父目录存在就跳过
                    if (parent_dir == "." || parent_dir == "..")
                    {
                        idx = pos + 1;
                        continue;
                    }
                    else if (exits(parent_dir) == true)
                    {
                        idx = pos + 1;
                        continue;
                    }
                    // 不存在就新建
                    else if (exits(parent_dir.c_str()) == false)
                    {
                        mkdir(parent_dir.c_str(), 0777);
                    }
                    idx = pos + 1;
                }
            }
        };
    }
}

#endif